package cn.mujiankeji.mbrowser.数据.数据库

import androidx.room.ColumnInfo
import androidx.room.Dao
import androidx.room.Entity
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.PrimaryKey
import androidx.room.Query
import androidx.room.Update
import kotlinx.coroutines.flow.Flow
import java.util.UUID

/**
 * 下载任务实体类
 * tableName 固定为 "DOWNLOAD"
 * Kotlin 属性为中文，数据库列名为英文。
 * 字段已设置默认值。
 */
@Entity
data class DBDownload(
    @PrimaryKey
    @ColumnInfo(name = "uid", defaultValue = "''")
    var uid: String = UUID.randomUUID().toString(),  // 对应领域模型的任务ID，通常是UUID字符串

    @ColumnInfo(name = "url", defaultValue = "")
    val 网址: String = "",

    @ColumnInfo(name = "target_path", defaultValue = "")
    val 目标路径: String = "",

    @ColumnInfo(name = "file_name", defaultValue = "")
    val 文件名: String = "",

    @ColumnInfo(name = "total_size_bytes", defaultValue = "0")
    val 文件大小: Long = 0L,

    @ColumnInfo(name = "downloaded_size_bytes", defaultValue = "0")
    val 已下载大小: Long = 0L,

    @ColumnInfo(name = "status_ordinal", defaultValue = "0")
    val 状态: Int = 0,  // 对应 cn.mujiankeji.mbrowser.功能.下载.模型.下载状态 枚举的 ordinal (例如：等待中)

    // Room的defaultValue不支持函数，实际插入时应由代码设置
    @ColumnInfo(name = "creation_timestamp", defaultValue = "0")
    val 创建时间: Long = System.currentTimeMillis(),

    @ColumnInfo(name = "completion_timestamp", defaultValue = "NULL")
    val 完成时间: Long? = null,

    @ColumnInfo(name = "engine_type_ordinal", defaultValue = "0")
    val 引擎类型: Int = 0,  // 对应 cn.mujiankeji.mbrowser.功能.下载.模型.下载引擎类型 枚举的 ordinal (例如：默认引擎)

    @ColumnInfo(name = "headers_json", defaultValue = "{}")
    val 请求头: String = "{}",  // JSON 序列化的请求头, 默认为空JSON对象

    @ColumnInfo(name = "user_agent", defaultValue = "NULL")
    val UserAgent: String? = null,

    @ColumnInfo(name = "download_type_ordinal", defaultValue = "0")
    val 类型: Int = 0,  // 对应 cn.mujiankeji.mbrowser.功能.下载.模型.下载类型 枚举的 ordinal (例如：普通类型)

    @ColumnInfo(name = "priority", defaultValue = "0")
    val 优先级: Int = 0,

    @ColumnInfo(name = "retry_count", defaultValue = "0")
    val 重试次数: Int = 0,

    @ColumnInfo(name = "error_message", defaultValue = "NULL")
    val 错误信息: String? = null,

    @ColumnInfo(name = "chunk_size", defaultValue = "NULL")
    val 分块大小 : Int? = null,

    @ColumnInfo(name = "chunk_count", defaultValue = "NULL")
    val 分块数量 : Int? = null,

    @ColumnInfo(name = "chunk_states", defaultValue = "NULL")
    val 分块状态 : String? = null, // List<分块状态>

    )

/**
 * 下载任务数据访问对象 (DAO)
 * 表名为 "DOWNLOAD"
 */
@Dao
interface DaoDownload {

    /**
     * 插入一个新的下载任务。如果任务已存在（基于ID），则替换它。
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun 插入下载任务(任务: DBDownload)

    /**
     * 更新一个已存在的下载任务。
     */
    @Update
    suspend fun 更新下载任务(任务: DBDownload)

    /**
     * 根据ID删除一个下载任务。
     */
    @Query("DELETE FROM DBDownload WHERE uid = :任务Id")
    suspend fun 删除下载任务(任务Id: String)

    /**
     * 根据ID获取一个下载任务的 Flow。
     */
    @Query("SELECT * FROM DBDownload WHERE uid = :任务Id")
    fun 获取下载任务Flow(任务Id: String): Flow<DBDownload?>

    /**
     * 根据ID获取一个下载任务的快照。
     */
    @Query("SELECT * FROM DBDownload WHERE uid = :任务Id")
    suspend fun 获取下载任务快照(任务Id: String): DBDownload?

    /**
     * 获取所有下载任务的 Flow，按创建时间降序排列。
     * 注意：查询中的 '创建时间' 是Kotlin属性名，Room会映射到 'creation_timestamp' 列。
     */
    @Query("SELECT * FROM DBDownload ORDER BY creation_timestamp DESC")
    fun 获取所有下载任务Flow(): Flow<List<DBDownload>>

    /**
     * 获取所有处于特定状态的下载任务 Flow。
     * 例如：获取所有正在下载或等待中的任务（活动任务）。
     * @param 状态码列表 目标状态的ordinal值列表。
     * 注意：查询中的 '优先级' 和 '创建时间' 是Kotlin属性名。
     */
    @Query("SELECT * FROM DBDownload WHERE status_ordinal IN (:状态码列表) ORDER BY priority DESC, creation_timestamp ASC")
    fun 获取特定状态任务Flow(状态码列表: List<Int>): Flow<List<DBDownload>>


    /**
     * 获取所有未完成的任务（等待中、正在下载、已暂停、失败后可重试）。
     * 按优先级降序，再按创建时间升序。
     * 注意：查询中的 '优先级' 和 '创建时间' 是Kotlin属性名。
     */
    @Query("SELECT * FROM DBDownload WHERE status_ordinal != :完成状态码 AND status_ordinal != :取消状态码 ORDER BY priority DESC, creation_timestamp ASC")
    fun 获取所有未完成任务Flow(完成状态码: Int, 取消状态码: Int): Flow<List<DBDownload>>


    /**
     * 获取所有已完成的任务，按完成时间降序。
     * 注意：查询中的 '完成时间' 是Kotlin属性名。
     */
    @Query("SELECT * FROM DBDownload WHERE status_ordinal = :状态码 ORDER BY completion_timestamp DESC")
    fun 获取已完成任务Flow(状态码: Int): Flow<List<DBDownload>>

    /**
     * 获取所有处于特定状态的下载任务快照列表，按创建时间降序排列。
     * @param 状态码 目标状态的ordinal值。
     * 注意：查询中的 '创建时间' 是Kotlin属性名。
     */
    @Query("SELECT * FROM DBDownload WHERE status_ordinal = :状态码 ORDER BY creation_timestamp DESC")
    suspend fun 获取特定状态任务快照列表(状态码: Int): List<DBDownload>

    /**
     * 清空所有下载任务记录。
     */
    @Query("DELETE FROM DBDownload")
    suspend fun 清空所有下载任务()

    /**
     * 获取所有下载任务的快照列表。
     * 注意：查询中的 '创建时间' 是Kotlin属性名。
     */
    @Query("SELECT * FROM DBDownload ORDER BY creation_timestamp DESC")
    suspend fun 获取所有下载任务快照(): List<DBDownload>
}